#include "BBObjectTest.h"

#include <QtTest/QtTest>
#include <QMap>
#include <QVariant>

#include "TestSuite.h"
#include "BBObject.h"
#include "Bear.h"

void BBObjectTest::setName()
{
	BBObject obj;
	QString name( "Test" );

	obj.setName( name );

	QCOMPARE( obj.getName(), name );
}

void BBObjectTest::setAttributesPrimitiveValue()
{
	BBObject obj;
	QMap<QString, QVariant> map1;
	QString attributeName( "Attr" );
	int attributeValueIn = 999;

	map1[attributeName] = attributeValueIn;
	obj.setAttributesPrimitiveValues( map1 );

	QMap<QString, QVariant> map2 = obj.getAttributesPrimitiveValues();

	int attributeValueOut = map2[attributeName].toInt();

	QCOMPARE( attributeValueOut, attributeValueIn );
}

void BBObjectTest::setOneAtributePrimitiveValue()
{
	BBObject obj;
	QString attributeName( "Attr" );
	int attributeValueIn = 999;

	obj.setAttributePrimitiveValue( attributeName, attributeValueIn );

	QMap<QString, QVariant> map( obj.getAttributesPrimitiveValues() );
	int attributeValueOut = map[attributeName].toInt();

	QCOMPARE( attributeValueOut, attributeValueIn );
}

void BBObjectTest::setAttributesCompositionValue()
{
	BBObject objAttribute;
	QString objAttributeName( "Test" );
	objAttribute.setName( objAttributeName );
	QString attributeName( "Attr" );
	int attributeValueIn = 999;
	objAttribute.setAttributePrimitiveValue( attributeName, attributeValueIn );
	
	Bear composite;
	QString compositeName( "Bear1" );
	composite.addObject( &objAttribute );

	BBObject obj;
	QMap<QString, QVariant> map1;
	map1[compositeName].setValue( composite );
	obj.setAttributesCompositionValues( map1 );

	QMap<QString, QVariant> map2 = obj.getAttributesCompositionValues();
	Bear composite2 = map2[compositeName].value<Bear>();
	BBObject objAttribute2 = *composite2.getObject( objAttributeName );

	QCOMPARE( objAttribute.getAttributePrimitiveValue( attributeName ).toInt(), objAttribute2.getAttributePrimitiveValue( attributeName ).toInt() );
}

void BBObjectTest::setOneAtributeCompositionValue()
{
	BBObject objAttribute;
	QString objAttributeName( "Test" );
	objAttribute.setName( objAttributeName );
	
	QString attributeName( "Attr" );
	int attributeValueIn = 999;
	objAttribute.setAttributePrimitiveValue( attributeName, attributeValueIn );

	Bear composite;
	QString compositeName( "Bear1" );
	composite.addObject( &objAttribute );

	BBObject obj;
	QVariant value;
	value.setValue( composite );
	obj.setAttributeCompositionValue( compositeName, value );

	Bear composite2 = obj.getAttributeCompositionValue( compositeName ).value<Bear>();
	BBObject objAttribute2 = *composite2.getObject( objAttributeName );

	QCOMPARE( objAttribute.getAttributePrimitiveValue( attributeName ).toInt(), objAttribute2.getAttributePrimitiveValue( attributeName ).toInt() );
}

void BBObjectTest::setAttributesTypes()
{
	BBObject obj;
	QMap<QString, QString> map1;
	QString attributeName( "Attr" );
	QString attributeTypeIn( "int" );

	map1[attributeName] = attributeTypeIn;
	obj.setAttributesTypes( map1 );

	QMap<QString, QString> map2 = obj.getAttributesTypes();

	QString attributeTypeOut( map2[attributeName] );

	QCOMPARE( attributeTypeOut, attributeTypeIn );
}

void BBObjectTest::setOneAtributeType()
{
	BBObject obj;
	QString attributeName( "Attr" );
	QString attributeTypeIn( "int" );

	obj.setAttributeType( attributeName, attributeTypeIn );

	QMap<QString, QString> map = obj.getAttributesTypes();
	QString attributeTypeOut( map[attributeName] );

	QCOMPARE( attributeTypeIn, attributeTypeOut );
}

REGISTER_TEST_CLASS( BBObjectTest );